<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="OMsoY" id="OMsoY"><span data-lake-id="u56bee128" id="u56bee128">典型回答</span></h1>
  <p data-lake-id="u8afb6551" id="u8afb6551"><span data-lake-id="u8d19665b" id="u8d19665b">有的时候，当我们对数据库做了分库分表后，因为最初的预估数据不够准确，导致后续数据增长很快，表不够了，那么遇到这种情况该怎么办呢？</span></p>
  <p data-lake-id="u9e5f74e3" id="u9e5f74e3"><span data-lake-id="u5c4aebf0" id="u5c4aebf0">​</span><br></p>
  <p data-lake-id="u6bd2d58a" id="u6bd2d58a"><span data-lake-id="uf8f0b048" id="uf8f0b048">首先，我们应该尽量避免这种情况的发生，在第一次决定分表的时候，就尽可能根据当前的业务增长量预估一下未来可能需要存储的数据量，并且最好一定的buffer，让这个分表尽可能够，避免出现不够的情况。</span></p>
  <p data-lake-id="u0c17687d" id="u0c17687d"><span data-lake-id="ueefdb251" id="ueefdb251">​</span><br></p>
  <p data-lake-id="u771dc2fa" id="u771dc2fa"><span data-lake-id="u54a8c890" id="u54a8c890">比如我们线上分表基本都是256、512、1024这样分的。</span></p>
  <p data-lake-id="u97235fa2" id="u97235fa2"><span data-lake-id="ud1d889f7" id="ud1d889f7">​</span><br></p>
  <p data-lake-id="u47e21190" id="u47e21190"><span data-lake-id="u2f982224" id="u2f982224">其次，如果真的后面就不够了，其实也没啥特别好的办法，要么就通用其他的手段来减少数据量，比如我们之前提到过的数据归档等。</span></p>
  <p data-lake-id="u17419dba" id="u17419dba"><span data-lake-id="u3edeae2e" id="u3edeae2e">​</span><br></p>
  <p data-lake-id="ud3646b87" id="ud3646b87"><br></p>
  <p data-lake-id="u6fc16b0b" id="u6fc16b0b"><span data-lake-id="u3be2a242" id="u3be2a242">那还有，就只剩一条路了，那就是二次分表，即原来的128张不够，那么就需要重新分成256张表。这个过程和第一次从单表分成128张表过程差不多。</span></p>
  <p data-lake-id="ubd54a317" id="ubd54a317"><span data-lake-id="u4d2e1963" id="u4d2e1963">​</span><br></p>
  <p data-lake-id="ud8282213" id="ud8282213"><span data-lake-id="u4656172a" id="u4656172a">涉及到分表算法的更新，数据的迁移等。其中最关键的就是如何无损、无缝的做数据迁移了，这个我后面会再加一篇单独写如何做数据迁移。（占坑。）</span></p>
  <p data-lake-id="u0146afef" id="u0146afef"><span data-lake-id="u15ae56f1" id="u15ae56f1">​</span><br></p>
  <p data-lake-id="uc01273ad" id="uc01273ad"><span data-lake-id="ub5f63171" id="ub5f63171">另外，还有一个值得考虑的，就是如果最开始用的是一致性hash的算法进行分表路由，那么在做二次分表的时候，数据迁移的成本就会低很多，因为影响的节点可能没那么多。</span></p>
  <p data-lake-id="uf140b8ed" id="uf140b8ed"><span data-lake-id="udd4eef44" id="udd4eef44">​</span><br></p>
  <p data-lake-id="u61a566b8" id="u61a566b8"><br></p>
  <p data-lake-id="ub2578dff" id="ub2578dff"><span data-lake-id="u63d82f89" id="u63d82f89">所以，总结一下，就是要么提前多分点、要么就是先办法减少数据量，如做数据归档，要么就是重新分，然后做数据迁移。如果提前考虑过的话，用了一致性哈希的话会影响更小一点。除了这些，也没啥更好的办法了。</span></p>
 </body>
</html>